# -*- coding: utf-8 -*-
"""
@Time    : 2024/9/6 11:52 
@Author  : ZhangShenao 
@File    : 5.完美数.py 
@Desc    : 完美数

完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和恰好等于它本身
例如: 6(6=1+2+3)和28(28=1+2+4+7+14)就是完美数
"""


def get_real_factors(n: int) -> list[int]:
    """获取一个正整数n的所以真因子(即除了自身以外的因子)列表"""

    if n < 1:
        return []

    # 遍历[1,n)范围,获取所有真因子
    real_factors: list[int] = []
    for i in range(1, n):
        if n % i == 0:
            real_factors.append(i)

    return real_factors


def is_perfect_number(n: int) -> bool:
    """判断一个正整数n是否为完美数"""
    if n < 1:
        return False

    # 获取n所有的真因子(即除了自身以外的因子)
    real_factors: list[int] = get_real_factors(n)

    # 如果所有真因子的和=n,则n为完美数
    return sum(real_factors) == n


def find_perfect_number(n: int) -> list[int]:
    """找到n以内的所有完美数"""

    # 输入校验
    if n < 1:
        raise ValueError("n must be greater than or equal to 1")

    # 遍历[1,n]范围,获取所有完美数
    perfect_nums: list[int] = []
    for i in range(1, n + 1):
        if is_perfect_number(i):
            perfect_nums.append(i)

    # 返回完美数列表
    return perfect_nums


if __name__ == '__main__':
    print(find_perfect_number(10000))
